function sol = Sudoku_ameliore(sudoku_init)

[sol, cube, marche, fini] = resol_facile(sudoku_init);

nb_possibilite = 10;
i_final = 0;
j_final = 0;

if (fini == 1)
    return;
end

L = {sol};

while size(L) ~= 0
	nb_possibilite = 10;
    taille = size(L, 2);
    essai = L{1, 1};
    if (taille == 1)
        L= {};
    else
        L = L(2:taille);
    end
    [sol, cube, marche, fini] = resol_facile(essai);
    % Des qu'on trouve une solution on s'arrete. A utiliser seulement pour la résolution d'un sudoku.
    if (fini == 1)
        return;
    end
% On est dans le cas où le sudoku marche mais il n'est pas fini, donc il faut faire des suppositions.
    if (marche == 1)
	for i= 1:9
	    for j=1:9
    	        if (sol(i, j) == 0)
		    somme = 0;
		    % On calcule le nombre de possibilité sur la case vide
		    somme = sum(cube(i, j, :));
		    % Si c'est plus petit alors on récupère les positions.
		    if (somme < nb_possibilite)
			i_final = i;
			j_final = j;
			nb_possibilite = somme;
		    end
		end
	    end
	end
	% On calcule les différentes possibilités et on les rajoute à la liste.
	for k=1:9
	    if (cube(i_final, j_final, k) == 1)
		S = sol;
		S(i_final, j_final) = k;
		L = [ S L ];
	    end
	end
    end
    % Dans le cas où marche = 0, on reviens au début car on a déjà enlevé le sudoku de la liste L.
end

% Si on passe ici, cela veut dire que l'on n'a pas trouvé de solutions et que 
sol = 0;

return;
